package com.intretech.umsin.code.generator.component;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @version V1.0
 * @ClassName: CamelCaseUtils
 * @Description:
 * @author: 李启联
 * @date: 2020-01-22 10:21
 * @Copyright: Copyright (c), 2020
 */
public class CamelCaseUtils {
    /*************************驼峰命名与下划线命名的转换******************************/
    public static final char UNDERLINE = '_';
    /**
     * 驼峰格式字符串转换为下划线格式字符串
     * eg: helloWord >> hello_word; HelloWord >> _hello_word;
     * @param param
     * @return
     */
    public static String camelToUnderline(String param) {
        return camelToUnderline(param,true);
    }

    /**
     * 驼峰格式字符串转换为下划线格式字符串 <br/>
     * eg: helloWord >> hello_word ; 【HelloWord >> _hello_word 如果 ignoreFirstChar 为 true 则：HelloWord >> hello_word 】;
     * 在C#语言中的命名中很多情况第一个字符为大写 如：属性的定义
     * @param param 需要转换的字符串
     * @param ignoreFirstChar 是否忽略第一个字符为大写的情况(在C#语言中的命名中很多情况第一个字符为大写[大驼峰] 如：属性的定义)
     * @return
     */
    public static String camelToUnderline(String param, boolean ignoreFirstChar) {
        if (param == null || "".equals(param.trim())) {
            return "";
        }
        int len = param.length();
        StringBuilder sb = new StringBuilder(len);
        for (int i = 0; i < len; i++) {
            char c = param.charAt(i);
            if (Character.isUpperCase(c)) {
                if(i == 0 && ignoreFirstChar) {//忽略第一个字母为大写的情况
                }
                else
                    sb.append(UNDERLINE);
                sb.append(Character.toLowerCase(c));
            } else {
                sb.append(c);
            }
        }
        return sb.toString();
    }

    /**
     * 下划线格式字符串转换为驼峰格式字符串
     * eg:hello_word >> helloWord ; HELLO_word >> HELLOWord
     * @param param
     * @return
     */
    public static String underlineToCamel(String param) {
        return underlineToCamel(param,false);
    }

    /**
     * 下划线格式字符串转换为驼峰格式字符串<br/>
     * eg:hello_word >> helloWord 如果 tranForFirstCharToUpCase 为tru 则 hello_word >> HelloWord ; HELLO_word >> HELLOWord
     * @param param 需要转换的字符串
     * @param tranForFirstCharToUpCase 是否把转换后的驼峰名称的第一个字符为大写
     * @return
     */
    public static String underlineToCamel(String param,boolean tranForFirstCharToUpCase) {
        if (param == null || "".equals(param.trim())) {
            return "";
        }
        int len = param.length();
        StringBuilder sb = new StringBuilder(len);
        for (int i = 0; i < len; i++) {
            char c = param.charAt(i);
            if (c == UNDERLINE) {
                if (++i < len) {
                    sb.append(Character.toUpperCase(param.charAt(i)));
                }
            } else {
                if(i == 0 && tranForFirstCharToUpCase)
                    sb.append(Character.toUpperCase(c));
                else
                    sb.append(c);
            }
        }
        return sb.toString();
    }

    /**
     * 下划线格式字符串转换为驼峰格式字符串2
     * hello_word (大小写无关) >> HelloWord ; HELLO_word >> HELLOWord
     * @param param
     * @return
     */
    public static String underlineToCamel2(String param) {
        if (param == null || "".equals(param.trim())) {
            return "";
        }
        StringBuilder sb = new StringBuilder(param);
        Matcher mc = Pattern.compile("_").matcher(param);
        int i = 0;
        while (mc.find()) {
            int position = mc.end() - (i++);
            sb.replace(position - 1, position + 1, sb.substring(position, position + 1).toUpperCase());
        }
        return sb.toString();
    }

    /**
     * 将首字母转小写
     * @param s 源字符串
     * @return
     */
    public static String toLowerCaseFirstOne(String s){
        if(Character.isLowerCase(s.charAt(0)))
            return s;
        else
            return (new StringBuilder()).append(Character.toLowerCase(s.charAt(0))).append(s.substring(1)).toString();
    }

    /**
     * 将首字母转大写
     * @param s 源字符串
     * @return
     */
    public static String toUpperCaseFirstOne(String s){
        if(Character.isUpperCase(s.charAt(0)))
            return s;
        else
            return (new StringBuilder()).append(Character.toUpperCase(s.charAt(0))).append(s.substring(1)).toString();
    }

}